package pe.com.bbva.configuracion.action;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import pe.com.bbva.configuracion.bo.ConfiguracionBO;
import pe.com.bbva.configuracion.domain.Configuracion;
import pe.com.bbva.mantenimiento.bo.TablaBO;
import pe.com.bbva.mantenimiento.domain.Tabla;
import pe.com.bbva.targps.bo.impl.UpdateQuartzBOImpl;
import pe.com.bbva.util.Constantes;
import pe.com.bbva.util.SelectItem;
import pe.com.stefanini.core.action.GenericAction;
import pe.com.stefanini.core.domain.UsuarioSession;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.service.ServiceUtil;
import pe.com.stefanini.core.util.StringUtil;

@Service("configuracionArchivoAction")
@Scope("prototype")
@Results({
	@Result(name="viewFormConfiguracionArchivo",type="tiles", location="viewFormConfiguracionArchivo"),
	@Result(name="viewConfiguracionArchivo",type="tiles", location="viewConfiguracionArchivo"),
	@Result(name="listTipoArchivos",type="json",params={"root","grid"}),
})
public class ConfiguracionArchivoAction extends GenericAction {

	private static final long serialVersionUID = 1L;

	private Logger logger = Logger.getLogger(this.getClass());

	@Resource
	private TablaBO tablaBO;
	
	@Resource
	private ConfiguracionBO configuracionBO;
	
	@Resource
	private UpdateQuartzBOImpl updateQuartzBOImpl;
	
	private Tabla tabla;
	private Tabla tablaBuscar;
	private Long idTabla;
	private String codigoAntiguo;
	private String tipoTabla;
	
	private Configuracion confiCarga;
	private Configuracion confiGps;
	private List<Tabla> listaTablas;
	
	
	private List<SelectItem> itemTipoFrecuencia;
	private List<SelectItem> itemTipoDia;
	private List<SelectItem> itemTipoMes;
	
	public void cleanForm() {
		setIdTabla(null);
		setCodigoAntiguo("");
		setTabla(null);
		setTablaBuscar(null);
	}
	
	@Action(value="initConfArchivos")
	public String init() {
		try{
			tablaBuscar = new Tabla();
			confiCarga = configuracionBO.findById(Constantes.ID_CONFIG_CARGA);
			confiGps = configuracionBO.findById(Constantes.ID_CONFIG_GPS);	
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewConfiguracionArchivo";
	}
	
	@Action(value="findAllTipoArchivo")
	public String findAllDetalle() {
		try {
			if (tablaBuscar == null) {
				tablaBuscar = new Tabla();
			}
			tablaBuscar.setId(Constantes.ID_TABLA_TIPO_ARCHIVO);
			setGrid(tablaBO.findDetalleToGrid(tablaBuscar,getSidx()+" "+getSord(),getPage(),getRows()));
			if(getGrid().getRecords().equals(new Integer(0))){
				addActionError("No se encontraron resultados");
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listTipoArchivos";
	}
	
	@Action(value="updateConfiguracionArchivo")
	public String updateFormArchivo() {
		try {
			tabla = tablaBO.findTablaById(idTabla);
			if(tabla.getPadre()==null){
				tipoTabla="1";
			}else{
				tipoTabla="2";
			}
			codigoAntiguo = tabla.getCodigo();
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewFormConfiguracionArchivo";
	}

	@Action(value="saveConfiguracionArchivo")
	public String save() {
		String forward = "";
		String mensaje = "";
		if (idTabla == null) {
			mensaje = "Registrado Correctamente";
		} else {
			mensaje = "Actualizado Correctamente";
		}
		try {
			UsuarioSession usuarioSession = (UsuarioSession) getObjectSession(Constantes.USUARIO_SESSION);
			setCamposAuditoria(tabla, usuarioSession);
			tablaBO.save(tabla,codigoAntiguo);
			listaTablas = tablaBO.findTablas(new Tabla());
			addActionMessage(mensaje);
			cleanForm();
			confiCarga = configuracionBO.findById(Constantes.ID_CONFIG_CARGA);
			confiGps = configuracionBO.findById(Constantes.ID_CONFIG_GPS);
			forward = "viewConfiguracionArchivo";
		} catch (BOException e) {
			forward = "viewFormConfiguracionArchivo";
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return forward;
	}
	
	@Action(value="saveConfiguracionFrecuencia")
	public String saveFrecuencia() {
		String forward = "";
		String mensaje = "";
		if (confiCarga.getId() == null) {
			mensaje = "Registrado Correctamente";
		} else {
			mensaje = "Actualizado Correctamente";
		}
		try {
			UsuarioSession usuarioSession = (UsuarioSession) getObjectSession(Constantes.USUARIO_SESSION);
			setCamposAuditoria(confiCarga, usuarioSession);
			setCamposAuditoria(confiGps, usuarioSession);
			confiCarga.setId(Constantes.ID_CONFIG_CARGA);
			if (confiCarga.getFrecuenciaCarga() == null
					|| confiCarga.getFrecuenciaCarga().getId() == null) {
				confiCarga.setFrecuenciaCarga(null);
			}else{
				if(confiCarga.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_DIARIA)){
					confiCarga.setDiaLunes(null);
					confiCarga.setDiaMartes(null);
					confiCarga.setDiaMiercoles(null);
					confiCarga.setDiaJueves(null);
					confiCarga.setDiaViernes(null);
					confiCarga.setDiaSabado(null);
					confiCarga.setDiaDomingo(null);
					confiCarga.setDiaEjecucion(null);
					confiCarga.setMesEjecucion(null);
				}else if(confiCarga.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_SEMANAL)){
					confiCarga.setDiaEjecucion(null);
					confiCarga.setMesEjecucion(null);
					confiCarga.setDiasLabNoLab(null);
				}else if(confiCarga.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_ANUAL)){
					confiCarga.setDiaLunes(null);
					confiCarga.setDiaMartes(null);
					confiCarga.setDiaMiercoles(null);
					confiCarga.setDiaJueves(null);
					confiCarga.setDiaViernes(null);
					confiCarga.setDiaSabado(null);
					confiCarga.setDiaDomingo(null);
					confiCarga.setDiasLabNoLab(null);
				}else if(confiCarga.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_MENSUAL)){
					confiCarga.setDiaLunes(null);
					confiCarga.setDiaMartes(null);
					confiCarga.setDiaMiercoles(null);
					confiCarga.setDiaJueves(null);
					confiCarga.setDiaViernes(null);
					confiCarga.setDiaSabado(null);
					confiCarga.setDiaDomingo(null);
					confiCarga.setDiasLabNoLab(null);
					confiCarga.setDiaEjecucion(null);
					confiCarga.setMesEjecucion(null);
				}
			}
			if (confiCarga.getDiasLabNoLab() == null
					|| confiCarga.getDiasLabNoLab().getId() == null) {
				confiCarga.setDiasLabNoLab(null);
			}
			if (confiCarga.getMesEjecucion() == null
					|| confiCarga.getMesEjecucion().getId() == null) {
				confiCarga.setMesEjecucion(null);
			}
			confiCarga.setNombreConfiguracion("cronTriggerTargps");
			configuracionBO.save(confiCarga, null);
			updateQuartzBOImpl.actualizarConfiguracionQuartz(confiCarga, null, false);
			
			confiGps.setId(Constantes.ID_CONFIG_GPS);
			if (confiGps.getFrecuenciaCarga() == null
					|| confiGps.getFrecuenciaCarga().getId() == null) {
				confiGps.setFrecuenciaCarga(null);
			}else{
				if(confiGps.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_DIARIA)){
					confiGps.setDiaLunes(null);
					confiGps.setDiaMartes(null);
					confiGps.setDiaMiercoles(null);
					confiGps.setDiaJueves(null);
					confiGps.setDiaViernes(null);
					confiGps.setDiaSabado(null);
					confiGps.setDiaDomingo(null);
					confiGps.setDiaEjecucion(null);
					confiGps.setMesEjecucion(null);
				}else if(confiGps.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_SEMANAL)){
					confiGps.setDiaEjecucion(null);
					confiGps.setMesEjecucion(null);
					confiGps.setDiasLabNoLab(null);
				}else if(confiGps.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_ANUAL)){
					confiGps.setDiaLunes(null);
					confiGps.setDiaMartes(null);
					confiGps.setDiaMiercoles(null);
					confiGps.setDiaJueves(null);
					confiGps.setDiaViernes(null);
					confiGps.setDiaSabado(null);
					confiGps.setDiaDomingo(null);
					confiGps.setDiasLabNoLab(null);
				}else if(confiGps.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_MENSUAL)){
					confiGps.setDiaLunes(null);
					confiGps.setDiaMartes(null);
					confiGps.setDiaMiercoles(null);
					confiGps.setDiaJueves(null);
					confiGps.setDiaViernes(null);
					confiGps.setDiaSabado(null);
					confiGps.setDiaDomingo(null);
					confiGps.setDiasLabNoLab(null);
					confiGps.setDiaEjecucion(null);
					confiGps.setMesEjecucion(null);
				}
			}
			if (confiGps.getDiasLabNoLab() == null
					|| confiGps.getDiasLabNoLab().getId() == null) {
				confiGps.setDiasLabNoLab(null);
			}
			if (confiGps.getMesEjecucion() == null
					|| confiGps.getMesEjecucion().getId() == null) {
				confiGps.setMesEjecucion(null);
			}
			confiGps.setNombreConfiguracion("cronTriggerTargpsUp");
			configuracionBO.save(confiGps, null);
			updateQuartzBOImpl.actualizarConfiguracionQuartz(confiGps, null, false);
			
			
			addActionMessage(mensaje);
			forward = "viewConfiguracionArchivo";
		} catch (BOException e) {
			forward = "viewFormConfiguracion";
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			forward = "viewFormConfiguracion";
			logger.error(StringUtil.getStackTrace(e));
		}
		return forward;
	}

	public Tabla getTabla() {
		return tabla;
	}

	public void setTabla(Tabla tabla) {
		this.tabla = tabla;
	}

	public Long getIdTabla() {
		return idTabla;
	}

	public void setIdTabla(Long idTabla) {
		this.idTabla = idTabla;
	}


	public String getTipoTabla() {
		return tipoTabla;
	}

	public void setTipoTabla(String tipoTabla) {
		this.tipoTabla = tipoTabla;
	}

	public Tabla getTablaBuscar() {
		return tablaBuscar;
	}

	public void setTablaBuscar(Tabla tablaBuscar) {
		this.tablaBuscar = tablaBuscar;
	}

	public List<Tabla> getListaTablas() {
		return listaTablas;
	}

	public void setListaTablas(List<Tabla> listaTablas) {
		this.listaTablas = listaTablas;
	}

	@SuppressWarnings("static-access")
	public List<SelectItem> getItemTipoFrecuencia() {
		itemTipoFrecuencia =((ServiceUtil) getObjectSession("serviceUtil")).getTiposSinSort(Constantes.ID_TABLA_TIPO_FRECUENCIA,Constantes.VAL_DEFAULT_SELECTION);
		return itemTipoFrecuencia;
	}

	public void setItemTipoFrecuencia(List<SelectItem> itemTipoFrecuencia) {
		this.itemTipoFrecuencia = itemTipoFrecuencia;
	}

	public List<SelectItem> getItemTipoDia() throws BOException, DAOException {
		itemTipoDia = new ArrayList<SelectItem>();
		List<Tabla> tipoDias = tablaBO.findHijos(Constantes.ID_TABLA_TIPO_DIA);
		for(Tabla tipoDia:tipoDias){
			itemTipoDia.add(new SelectItem(tipoDia.getId().toString(), tipoDia.getDescripcion()));
		}
		return itemTipoDia;
	}

	public void setItemTipoDia(List<SelectItem> itemTipoDia) {
		this.itemTipoDia = itemTipoDia;
	}

	@SuppressWarnings("static-access")
	public List<SelectItem> getItemTipoMes() {
		itemTipoMes =((ServiceUtil) getObjectSession("serviceUtil")).getTiposSinSort(Constantes.ID_TABLA_MESES,Constantes.VAL_DEFAULT_SELECTION);
		return itemTipoMes;
	}

	public void setItemTipoMes(List<SelectItem> itemTipoMes) {
		this.itemTipoMes = itemTipoMes;
	}

	public String getCodigoAntiguo() {
		return codigoAntiguo;
	}

	public void setCodigoAntiguo(String codigoAntiguo) {
		this.codigoAntiguo = codigoAntiguo;
	}

	public Configuracion getConfiCarga() {
		return confiCarga;
	}

	public void setConfiCarga(Configuracion confiCarga) {
		this.confiCarga = confiCarga;
	}

	public Configuracion getConfiGps() {
		return confiGps;
	}

	public void setConfiGps(Configuracion confiGps) {
		this.confiGps = confiGps;
	}
}